package com.solution.admin.auth.dao.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.alibaba.fastjson.JSONArray;
import com.solution.admin.auth.dao.ResourceDao;
import com.solution.admin.auth.entity.ResourceEntity;
import com.solution.common.dao.impl.BaseDaoImpl;
import com.solution.common.utils.string.StringUtil;

/**
 * 资源dao实现
 * 
 * @author zhuoyu
 * @date 2017年4月7日 上午9:20:50
 */
@Repository
public class ResourceDaoImpl extends BaseDaoImpl<ResourceEntity> implements ResourceDao {

	public static final String SQL_GET_RESOURCE_FORTREE = "getResourceForTree";

	@Autowired
	private SqlSessionTemplate sessionTemplate;

	/**
	 * 根据id删除资源
	 * 
	 * @param id
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:54:31
	 */
	@Override
	public int deleteById(long id) {
		return super.deleteById(id);
	}

	/**
	 * 添加资源
	 * 
	 * @param resourceEntity
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:54:49
	 */
	@Override
	public long insert(ResourceEntity resourceEntity) {
		return super.insert(resourceEntity);
	}

	/**
	 * 修改资源
	 * 
	 * @param t
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:55:05
	 */
	@Override
	public int update(ResourceEntity t) {
		return super.update(t);
	}

	/**
	 * 根据id查询资源
	 * 
	 * @param id
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:55:20
	 */
	@Override
	public ResourceEntity getById(Long id) {
		return super.getById(id);
	}

	/**
	 * 查询资源集合
	 * 
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:55:39
	 */
	@Override
	public List<ResourceEntity> listBy() {
		return super.listBy(null);
	}

	/**
	 * 查询用户登录某系统的权限列表
	 * 
	 * @param param
	 *            userId 用户id systemId 登录系统的id
	 * @return
	 * @author llp
	 * @date 2017年4月18日 上午11:54:38
	 */
	@Override
	public List<ResourceEntity> listResource(Map<String, Object> param) {
		return getSessionTemplate().selectList(getStatement("listResource"), param);
	}

	/**
	 * 根据经销商id查询资源
	 * 
	 * @param dealerId
	 *            经销商ID
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:55:52
	 */
	@Override
	public List<ResourceEntity> getResourceForTree() {
		return sessionTemplate.selectList(getStatement(SQL_GET_RESOURCE_FORTREE));
	}

	/**
	 * 查询用户菜单
	 * 
	 * @param param
	 *            userId 用户id systemId 登录系统的id
	 * @return
	 * @author llp
	 * @date 2017年4月18日 上午11:54:38
	 */
	@Override
	public List<ResourceEntity> listResourceMenu(Map<String, Object> param) {
		return getSessionTemplate().selectList(getStatement("listResourceMenu"), param);
	}

	/**
	 * 通过复杂的参数统计资源信息的数量
	 * 
	 * @param paramMap
	 *            参数集合
	 * @return 符合条件的记录数
	 */
	@Override
	public int listByExCount(Map<String, Object> paramMap) {
		return getSessionTemplate().selectOne(getStatement("listByExCount"), paramMap);
	}

	/**
	 * 取得某经销商角色的资源列表
	 * 
	 * @param dealerId
	 *            经销商ID
	 * @param roleId
	 *            角色ID
	 * @return 符合条件的对象集合
	 */
	@Override
	public List<ResourceEntity> getRoleResourceList( Long roleId) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("roleId", roleId);
		return this.getSessionTemplate().selectList(this.getStatement("getRoleResourceList"), paramMap);
	}

	/**
	 * 对经销商角色进行资源授权
	 * 
	 * @param dealerId
	 *            经销商ID
	 * @param roleId
	 *            角色ID
	 * @param resourceIds
	 *            分配的资源ID集合
	 * @param makeIds
	 *            通过GEN生成的角色资源唯一ID集合
	 * @return 已分配资源数量
	 */
	@Override
	public int insertRoleResource( Long roleId, List<String> resourceIds) {
		int result = 0;
		if (resourceIds!=null && resourceIds.size()>0) {
			
			for (String rid : resourceIds) {
				HashMap<String, Object> paramMap = new HashMap<String, Object>();
				paramMap.put("resourceId", rid);
				paramMap.put("roleId", roleId);
				result += this.getSessionTemplate().insert(this.getStatement("insertRoleResource"), paramMap);
			}
		}
		return result;
	}

	/**
	 * 清除某经销商角色的已分配资源
	 * 
	 * @param roleId
	 *            角色ID
	 * @param dealerId
	 *            经销商ID
	 * @return 清除的资源数量
	 */
	@Override
	public int clearRoleResource(Long roleId) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("roleId", roleId);
		return this.getSessionTemplate().update(this.getStatement("clearRoleResource"), paramMap);
	}

	/**
	 * 取得指定用户的可用菜单项
	 * 
	 * @param dealerId
	 *            经销商编号
	 * @param userId
	 *            用户编号
	 * @return 取得的菜单资源列表（树形有下级）
	 */
	@Override
	public List<ResourceEntity> getUserMenuList(Long userId) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("userId", userId);
		paramMap.put("parentId", new Long(1L));
		List<ResourceEntity> resourceList = this.getSessionTemplate().selectList(this.getStatement("getLoginUserMenu"), paramMap);
		if(resourceList != null && resourceList.size() > 0){
			for (ResourceEntity resource : resourceList) {
				if(StringUtil.isNotEmpty(resource.getChildListStr())){
					List<ResourceEntity> childList = JSONArray.parseArray("["+resource.getChildListStr()+"]", ResourceEntity.class);
					resource.setChildList(childList);
				}
			}
		}
		return resourceList;
	}

	/**
	 * 判断下级菜单数量
	 * 
	 * @param dealerId
	 *            经销商ID
	 * @param userId
	 *            用户ID
	 * @param parentId
	 *            上级菜单ID
	 * @return 数量
	 */
	private long getUserMenuCount( Long userId, Long parentId) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		//paramMap.put("dealerId", dealerId);
		paramMap.put("userId", userId);
		paramMap.put("parentId", parentId);
		return this.getSessionTemplate().selectOne(this.getStatement("getUserMenuCount"), paramMap);
	}

}
